/**
 * 2D 渲染视图组件
 * 
 * 职责：
 * 1. 缓存 2D 渲染相关组件（Sprite, Label）
 * 2. 提供 2D 渲染的便捷方法
 * 
 * 适用场景：
 * - 2D 游戏对象（角色、敌人、道具等）
 * - 需要 Sprite 或 Label 渲染的实体
 * 
 * 内存占用：~64 bytes
 * - 基类: ~40 bytes
 * - _sprite: 8 bytes
 * - _label: 8 bytes
 * - _uiTransform: 8 bytes
 * 
 * @author AI Assistant
 * @date 2025-11-29
 */

import { ecs } from "../../../../core/ecs/ECS";
import { Sprite, Label, UITransform, Color } from "cc";
import { ViewComponentBase } from "./ViewComponentBase";

/**
 * 2D 渲染视图组件
 */
@ecs.register('View2D', false)
export class ViewComponent2D extends ViewComponentBase {
    // ========== 懒加载缓存 ==========
    
    /** Sprite 组件（图片渲染）- 懒加载 */
    private _sprite: Sprite | null | undefined = undefined;
    
    /** Label 组件（文本渲染）- 懒加载 */
    private _label: Label | null | undefined = undefined;
    
    /** UITransform 组件（UI 变换）- 懒加载 */
    private _uiTransform: UITransform | null | undefined = undefined;
    
    // ========== 懒加载 Getter ==========
    
    /**
     * 获取 Sprite 组件（懒加载）
     */
    get sprite(): Sprite | null {
        if (this._sprite === undefined) {
            this._sprite = this.node?.getComponent(Sprite) || null;
        }
        return this._sprite;
    }
    
    /**
     * 获取 Label 组件（懒加载）
     */
    get label(): Label | null {
        if (this._label === undefined) {
            this._label = this.node?.getComponent(Label) || null;
        }
        return this._label;
    }
    
    /**
     * 获取 UITransform 组件（懒加载）
     */
    get uiTransform(): UITransform | null {
        if (this._uiTransform === undefined) {
            this._uiTransform = this.node?.getComponent(UITransform) || null;
        }
        return this._uiTransform;
    }
    
    /**
     * 重置组件
     */
    reset(): void {
        super.reset();
        this._sprite = undefined;
        this._label = undefined;
        this._uiTransform = undefined;
    }
    
    // ========== 便捷方法 ==========
    
    /**
     * 设置精灵颜色
     */
    setSpriteColor(color: Color): void {
        if (this.sprite) {
            this.sprite.color = color;
        }
    }
    
    /**
     * 设置精灵透明度
     */
    setSpriteOpacity(opacity: number): void {
        if (this.sprite) {
            const color = this.sprite.color.clone();
            color.a = opacity;
            this.sprite.color = color;
        }
    }
    
    /**
     * 设置文本内容
     */
    setLabelText(text: string): void {
        if (this.label) {
            this.label.string = text;
        }
    }
    
    /**
     * 设置文本颜色
     */
    setLabelColor(color: Color): void {
        if (this.label) {
            this.label.color = color;
        }
    }
    
    /**
     * 检查是否有渲染组件
     */
    hasRenderComponent(): boolean {
        return this.sprite !== null || this.label !== null;
    }
}

